/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;

import modelo.Avaliacao;
import modelo.Categoria;
import modelo.Contrato;
import modelo.DonoProjeto;
import modelo.Freelancer;
import modelo.Projeto;
import modelo.Usuario;
import util.Util;
import dao.ContratoDAO;
import enumeracao.NotaEnum;
import enumeracao.StatusContrato;

@ManagedBean
@RequestScoped
public class ContratoBean {

	@ManagedProperty(value = "#{requestScope.entityManager}")
	private EntityManager entityManager;
	@ManagedProperty(value = "#{sessionScope.usuarioSessaoBean.usuario}")
	private Usuario usuario;
	private List<Contrato> contratos = new ArrayList<Contrato>();
	private boolean emAberto = false;
	private Contrato contrato = new Contrato();
	private Contrato contratoConsultado = new Contrato();
	private Integer ano;
	private String nome;
	private Categoria categoria;
	private Calendar dataAtual = Calendar.getInstance();
	private NotaEnum nota;
	private Avaliacao avaliacao;

	public Integer getAno() {
		return ano;
	}

	public void setAno(Integer ano) {
		this.ano = ano;
	}

	private ContratoDAO contratoDAO;

	public EntityManager getEntityManager() {
		return entityManager;
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public List<Contrato> getContratos() {
		return contratos;
	}

	public void setContratos(List<Contrato> contratos) {
		this.contratos = contratos;
	}

	public Contrato getContrato() {
		return contrato;
	}

	public void setContrato(Contrato contrato) {
		this.contrato = contrato;
	}

	@PostConstruct
	public void iniciar() {

		contratoDAO = new ContratoDAO(entityManager);
		contrato.setProjeto(new Projeto());
		avaliacao = new Avaliacao();

		if (usuario instanceof DonoProjeto) {

			this.contrato.setDonoProjeto((DonoProjeto) usuario);
		} else {
			this.contrato.setFreelancer((Freelancer) usuario);
		}
		contrato.getProjeto().setCategoria(categoria);

		this.contratos = contratoDAO.pesquisar(contrato);

	}

	public void pesquisar() {
		if (!Util.isNull(ano)) {
			Calendar dataInicio = Calendar.getInstance();
			dataInicio.set(Calendar.YEAR, ano);
			this.contrato.setDataInicio(dataInicio);
		}

		if (emAberto) {
			this.contrato.setStatus(StatusContrato.ABERTO);
		} else {
			this.contrato.setStatus(null);
		}

		contrato.getProjeto().setCategoria(categoria);
		contrato.getProjeto().setNome(nome);

		contratos = contratoDAO.pesquisar(this.contrato);
		
		/* seleciona o primeiro da lista*/
		if (!contratos.isEmpty()) {
			contratoConsultado = contratos.get(0);
		}
	}

	public Contrato getContratoConsultado() {
		return contratoConsultado;
	}

	public void setContratoConsultado(Contrato contratoConsulta) {
		this.contratoConsultado = contratoConsulta;
	}

	public ContratoDAO getContratoDAO() {
		return contratoDAO;
	}

	public void setContratoDAO(ContratoDAO contratoDAO) {
		this.contratoDAO = contratoDAO;
	}

	public void consultar(Long id) {
		this.contratoConsultado = contratoDAO.consultar(id);
	}

	public void finalizarContrato() {
		ContratoDAO contratoDAO = new ContratoDAO(entityManager);

		Contrato contrato = contratoDAO.consultar(contratoConsultado.getId());
		contrato.setAvaliacao(avaliacao);
		contrato.setStatus(StatusContrato.FECHADO);
		contrato.setDataFim(Calendar.getInstance());
		contratoDAO.atualizar(contrato);
		
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Contrato fechado com Sucesso"));
		
		

	}

	public List<Integer> getAnos() {
		return Util.listYears();
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public boolean isEmAberto() {
		return emAberto;
	}

	public void setEmAberto(boolean emAberto) {
		this.emAberto = emAberto;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Calendar getDataAtual() {
		return dataAtual;
	}

	public void setDataAtual(Calendar dataAtual) {
		this.dataAtual = dataAtual;
	}

	public NotaEnum getNota() {
		return nota;
	}

	public void setNota(NotaEnum nota) {
		this.nota = nota;
	}

	public Avaliacao getAvaliacao() {
		return avaliacao;
	}

	public void setAvaliacao(Avaliacao avaliacao) {
		this.avaliacao = avaliacao;
	}
	
	
	
	
	
	
	
	
	

}
